<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>05_Function扩展</title>
</head>
<body>
<!--
1. Function.prototype.bind(obj) :
  * 作用: 将函数内的this绑定为obj, 并将函数返回
2. 面试题: 区别bind()与call()和apply()?
  * 都能指定函数中的this
  * call()/apply()都是立即调用函数
  * bind()则是将函数返回
3. 区别bind()和call()和apply()?
  * 第一个参数都可以是null或undefined，在非严格模式下，第一个参数为null或undefined时会自动替换为全局对象。
  * call()接收的是参数列表，而apply()则接收参数数组。
4. 如何选用:
  * 如果不需要关心具体有多少参数传入函数，选用apply()
  * 如果确定函数可接受多少参数，并且想一目了然表达形参和实参的对应关系，选用call()
  * 不会立即调用当前的函数,而是将函数返回,则选用bind()
-->
<script type="text/javascript">
		var obj={name:"独孤求败"}
		function foo(age,name){
			console.log(this,age,name);//Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …} undefined undefined
		}
		foo();
		
		// 传入参数的形式
		foo.apply(undefined,[30,'凌雪鸦']);//Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …} 30 "凌雪鸦"
		foo.call(null,40,'殇不患');//Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …} 40 "殇不患"
		
		// bind不会立即调用当前的函数,而是将函数返回
		// 如何需要执行的话，必须在后加上()调用
		foo.bind(obj,20,obj.name)();//{name: "独孤求败"} 20 "独孤求败"

</script>
</body>
</html>